package corp.edu.amadeus.core.facade.ifc;

import java.util.List;
import corp.edu.amadeus.core.exception.BadSearchParamsException;
import corp.edu.amadeus.core.business.object.ifc.IPersistable;

public interface IGenericSearchFacade {

    /**
     * Devolver una lista de objetos de tipo <code>po</code>.
     *
     * @param po el tipo de objecto persistente requirido
     * @return todos los objetos persistentes de tipo <code>po</code>
     * @see com.vilaumedia.commons.facade.ifc.IGenericSearchFacade#findAll(java.lang.Class)
     */
    public List findAll(Class po);



   /**
    * Devuelve la instance de la clase <code>po</code> filtrado por el metodo
    * <code>keyMetName</code> con el valor <code>keyValue</code> que debe ser
    * unica por el objecto buscado. <strong>IMPORTANTE</strong> el metodo
    * debe estar sin el get/set, y empezar con minuscula. ej getName seria
    * name.
    *
    * @param po la clase del persistence object buscado.
    * @param keyMetName el nombre del metodo que es clave.
    * @param keyValue filtro del resultado de keyMetValue.
    * @return el objecto con el keyMetName de keyValue.
    * resultado.
    * @throws NoSuchBOException si la busqueda no encuentra el objecto bescado.
    * @see com.vilaumedia.commons.facade.ifc.IGenericSearchFacade#findByKey(java.lang.Class, java.lang.String, java.lang.String)
    */
   public IPersistable findByKey(Class po, String keyMetName, Object keyValue)
       throws Exception;
   /**
    * Devuelve una lista con objetos de la clase <code>po</code> filtrado por el metodo
    * <code>keyMetName</code> con el valor <code>keyValue</code> que debe ser
    * unica por el objecto buscado. <strong>IMPORTANTE</strong> el metodo
    * debe estar sin el get/set, y empezar con minuscula. ej getName seria
    * name.
    *
    * @param po la clase del persistence object buscado.
    * @param keyMetName el nombre del metodo que es clave.
    * @param keyValue filtro del resultado de keyMetValue.
    * @return el objecto con el keyMetName de keyValue.
    * resultado.
    * @throws NoSuchBOException si la busqueda no encuentra el objecto bescado.
    * @see com.vilaumedia.commons.facade.ifc.IGenericSearchFacade#findByKey(java.lang.Class, java.lang.String, java.lang.String)
    */
   public List findByAttribs(Class po, List<String> keyList, List<Object> keyValueList)
   	throws NoSuchMethodException, BadSearchParamsException;

   public List findByAttribsWithOrder(Class po, List<String> attribsList,
		List<Object> attribsLisValueList, String orderProperty, String orderType)
	   	throws NoSuchMethodException, BadSearchParamsException;

   public List findByAttribsWithOrderAndLimit(Class po, List<String> attribsList,
		List<Object> attribsLisValueList, String orderProperty, String orderType,
		int limit) throws NoSuchMethodException, BadSearchParamsException;

   public List findByQuery(String query);


}
